package com.wx.gof.pattern.structural.decorator;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案
 * 描述:
 * 在不使用创造更多子类的情况下，在基础对象的行为之上进行装饰加强
 * 适用场景:
 * 1.扩展一个类的功能或给一个类添加附加职责
 * 2.动态的给一个对象添加功能，这些功能可以再动态的撤销
 * 优点:
 * 1.继承的有力补充，比继承灵活，不改变原有对象的情况下给一个对象扩展功能
 * 2.通过不同的装饰类，不同的顺序装饰，可以实现不同的效果
 * 缺点:
 * 1.会出现耕读哦的代码，更多的类，增加程序复杂度
 * 2.动态装饰时，多层装饰时会更复杂
 * 装饰与代理的区别:
 * 二者最主要的区别是：代理模式中，代理类对被代理的对象有控制权，决定其执行或者不执行。而装饰模式中，
 * 装饰类对代理对象没有控制权，只能为其增加一层装饰，以加强被装饰对象的功能，仅此而已。
 * 理解:
 * 应用程序-装饰者模式(适用开闭原则，扩展性强，在基础对象上做装饰操作，装饰可以自由组合，按需求扩展)
 * @Date 2018-12-08-1:49
 */
public class Application {
    public static void main(String[] agrs) {
        //创建基础对象-煎饼果子
        IBattercake iBattercake = new Battercake();
        //煎饼果子加一个鸡蛋(使用加鸡蛋装饰器对加了香肠的煎饼果子进行装饰)
        iBattercake = new EggDecorator(iBattercake);
        //煎饼果子加一根香肠(使用加香肠装饰器对煎饼果子进行装饰)
        iBattercake = new SausageDecorator(iBattercake);
        //再加一根香肠(使用加香肠装饰器对加了香肠与鸡蛋的煎饼果子进行装饰)
        iBattercake = new SausageDecorator(iBattercake);
        System.out.println(iBattercake.getDesc() + "价格:" + iBattercake.cost());
    }
}
